home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turnbull China Bikeride
/
Turnbull China Bikeride - Disc 2.iso
/
STUTTGART
/
LANG
/
ASSEMBLER
/
MOTOASM
/
EXAMPLES
/
as11
/
FORTH11
< prev
next >
Wrap
Text File
|
1994-09-03
|
97KB
|
3,576 lines
*
*
*
* FORTH11.ASM fig-FORTH for the Motorola MC68HC11A1
*
* October 30, 1990
*
*
******************************************************************************
*
* Memory Map
*
*
* $0000 - $00ff 68hc11 internal ram
*
* $1000 - $103F 68hc11 internal registers
*
* $2000 - $7FFF 8k RAM
*
* $E000 - $FFFF 8k EPROM w/FORTH and 68hc11 vectors
*
NAM FORTH
*
******************************************************************************
*
* forth interpreter/compiler
*
******************************************************************************
*
*
*
MEMTOP EQU $7FFF
RAMTOP EQU $7600
OPTION EQU $1039
*
* each disk buffer block is one 256 byte sector
* with a 2 byte block id and a 2 byte null terminator
*
* 8 - 256 byte blocks = 2 - 1024 byte screens
*
NBLK EQU 8
MEMEND EQU 260*NBLK+RAMTOP
*
*
*
REGBS EQU $1000 ; start of registers
BAUD EQU REGBS+$2B ; sci baud reg
SCCR1 EQU REGBS+$2C ; sci control1 reg
SCCR2 EQU REGBS+$2D ; sci control2 reg
SCSR EQU REGBS+$2E ; sci status reg
SCDAT EQU REGBS+$2F ; sci data reg
PORTA EQU REGBS+$00
PACTL EQU REGBS+$26
TMSK2 EQU REGBS+$24
TFLG2 EQU REGBS+$25
*
*
*
******************************************************************************
*
* zero page memory
*
******************************************************************************
*
N EQU $0000 ; scratch for (FIND),ENCLOSE,CMOVE
* ; EMIT,KEY,SP@,SWAP,DOES>,COLD
*
* registers used by the FORTH virtual machine
*
W EQU $0020 ; instruction reg points to 6800 code
IP EQU $0022 ; inst. pointer points to pointer to 6800 code
RP EQU $0024 ; return stack pointer
UP EQU $0026 ; pointer to base of current user@@s @@USER@@ table
* ( altered during multitasking )
*
*
******************************************************************************
*
* system parameters initialized by COLD or WARM
* names refer to FORTH words of similar ( no X ) name
*
******************************************************************************
*
ORG $2000
*
UORIG RMB 6 ; user variables
XSPZER RMB 2 ; initial top of data stack for user
XRZERO RMB 2 ; initial top of return stack
XTIB RMB 2 ; start of terminal input buffer
XWIDTH RMB 2 ; name field width
XWARN RMB 2 ; warning message mode (0 = no disc)
XFENCE RMB 2 ; fence for FORGET
XDP RMB 2 ; dictionary pointer
XVOCL RMB 2 ; vocabulary linking
XBLK RMB 2 ; disk block being accessed
XIN RMB 2 ; scan pointer into the block
XOUT RMB 2 ; cursor position
XSCR RMB 2 ; disc screen being accessed
XOFSET RMB 2 ; disc sector offset for multi disc
XCONT RMB 2 ; last word in primary search vocab.
XCURR RMB 2 ; last word in extensible vocabulary
XSTATE RMB 2 ; interpret/compile mode flag
XBASE RMB 2 ; number base for i/o numeric conversion
XDPL RMB 2 ; decimal point place
XFLD RMB 2 ;
XCSP RMB 2 ; current stack pos, for compile checks
XRNUM RMB 2 ;
XHLD RMB 2 ;
XDELAY RMB 2 ; carriage return delay count
XCOLUM RMB 2 ; carriage width
IOSTAT RMB 2 ; last acia status from read/write
*
* end of user table, start of common system variables
*
XUSE RMB 2 ;
XPREV RMB 2 ;
XTRACK RMB 2 ; ( 4 spares ! )
XSECTOR RMB 2
XDSTAT RMB 2
XBLOCK RMB 2
XBUFFER RMB 2
*
* code here through REND is overwritten at time of cold
* load.
*
FCB $C5
FCC 'FORT'
FCB $C8
FDB NOOP-7
FORTH FDB DODOES,DOVOC,$81A0,TASK-7
FDB 0
FCC '(C) Forth Interest Group, 1979'
FCB $C4
FCC 'TAS'
FCB $CB
FDB FORTH-8
TASK FDB DOCOL,SEMIS
REND EQU * ; first empty location in dictionary
******************************************************************************
*
*
*
******************************************************************************
ORG $E000 ;
*
* initialize
*
INIT SEI
LDAA #$B3
STAA OPTION ;
*
* initialize sci for 9600 baud at 8.0 mhz
*
LDAA #$30
STAA BAUD ; baud register
LDAA #$00
STAA SCCR1
LDAA #$0C
STAA SCCR2 ; enable
******************************************************************************
*
* cold entry
*
******************************************************************************
ORIG NOP
JMP CENT
******************************************************************************
*
* warm entry
*
******************************************************************************
NOP ;
JMP WENT ; warm start
* ; keeps current dictionary intact
******************************************************************************
*
* startup parameters
*
******************************************************************************
FDB $6811,0001 ; cpu and revision
FDB 0 ; topmost word in FORTH vocabulary
BACKSP FDB $08 ; backspace character for editing
UPINIT FDB UORIG ; initial user area
SINIT FDB RAMTOP-$100 ; initial top of data stack
RINIT FDB RAMTOP-2 ; initial top of return stack
FDB RAMTOP-$D0 ; terminal input buffer
FDB 31 ; initial name field width
FDB 0 ; initial warning mode (0 = no disc)
FENCIN FDB REND ; initial fence
DPINIT FDB REND ; cold start value for DP
VOCINT FDB FORTH+8 ; cold start value for VOC-LINK
COLINT FDB 80 ; initial terminal carriage width
DELINT FDB 4 ; initial carriage return delay
*
*
*
PULABX PULA ; get data word
PULB
STABX STD 0,X ; store at address
BRA NEXT
*
GETX LDD 0,X ; get data from address
PUSHBA PSHB ; and save on stack
PSHA
*
*=================== the virtual machine =====================================
*
NEXT LDX IP
INX ; pre-increment mode
INX
STX IP
NEXT2 LDX 0,X ; get W which points to CFA of word to be done
NEXT3 STX W
NEXT5 LDX 0,X ; get VECT which points to executable code
JMP 0,X ; and then do it
NOP
*
*=============================================================================
*
*=======>> 1 << LIT ; primitive
*
FCB $83
FCC 'LI'
FCB $D4
FDB 0 ; link of zero to terminate dictionary scan
LIT FDB *+2
LDX IP ; get instruction pointer
INX
INX
STX IP ; x points to next instruction
LDD 0,X ; next instruction is 16 bit literal
JMP PUSHBA ; so push it on stack
*
*=======>> 3 << EXECUTE ; primitive
*
FCB $87
FCC 'EXECUT'
FCB $C5
FDB LIT-6
EXEC FDB *+2
TSX ; move stack pointer to x
LDX 0,X ; get code field address (CFA)
INS ; pop stack
INS
JMP NEXT3 ; go execute word that cfa points to
*
*=======>> 4 << BRANCH
*
FCB $86
FCC 'BRANC'
FCB $C8
FDB EXEC-10
BRAN FDB ZBYES ; go do unconditional branch
*
*=======>> 5 << 0BRANCH ; primitive
*
FCB $87
FCC '0BRANC'
FCB $C8
FDB BRAN-9
ZBRAN FDB *+2
PULA ; get flag
PULB
ABA ; add together to see if zero
BNE ZBNO ; a and b are not zero - don@@t branch
BCS ZBNO ; if overflow a and b are not zero !
*
* flag is false ( zero ) - branch
*
ZBYES LDX IP ; code is shared with BRANCH, (+LOOP),(LOOP)
LDD 2,X ; get offset
ADDD IP ; add offset to instruction pointer
STD IP ; save it
JMP NEXT ; go branch !
*
* flag is true ( non-zero ) - don@@t branch
*
ZBNO LDX IP ; no branch. this code is shared with (+LOOP),(LOOP)
INX ; jump over branch delta
INX
STX IP ; save pointer
JMP NEXT ; go do next instruction
*
*=======>> 6 << (LOOP) ; primitive
*
FCB $86
FCC '(LOOP'
FCB $A9
FDB ZBRAN-10
XLOOP FDB *+2
CLRA ; upper 8 is zero
LDAB #1 ; get set to increment counter by 1
BRA XPLOP2 ; go steal other guy@@s code
*
*=======>> 7 << (+LOOP) ; primitive
*
FCB $87
FCC '(+LOOP'
FCB $A9
FDB XLOOP-9
XPLOOP FDB *+2 ; +LOOP has an unsigned loop counter
PULA ; get increment value
PULB
XPLOP2 TSTA ; check if forward or backward looping
BPL XPLOF ; forward looping
LDX RP
ADDD 2,X
STD 2,X
SEC
SBCB 5,X
SBCA 4,X
BPL ZBYES
BRA XPLONO ; fall thru
*
XPLOF NOP
LDX RP
ADDD 2,X
STD 2,X
* BSR XPLOPS
SUBD 4,X
BMI ZBYES
XPLONO INX ; done, don@@t branch back
INX
INX
INX
STX RP
BRA ZBNO
*
*=======>> 8 << (DO) ; primitive
*
FCB $84
FCC '(DO'
FCB $A9
FDB XPLOOP-10
XDO1 FDB *+2 ; this is the RUN-TIME DO, not the COMPILING DO
LDX RP ; get copy of return pointer
DEX
DEX
DEX
DEX
STX RP ;
PULA ; pull data word off stack
PULB
STD 2,X ; save on return stack
PULA ; pull ??? off stack
PULB
STD 4,X ; save on return stack
JMP NEXT
*
*=======>> 9 << I ; primitive
*
FCB $81 ; I
FCB $C9
FDB XDO1-7
I FDB *+2
LDX RP ; looks like I is kept on return stack
INX
INX
JMP GETX ;
*
*=======>> 10 << DIGIT
*
FCB $85
FCC 'DIGI'
FCB $D4
FDB I-4
DIGIT FDB *+2 ; legal input range is 0-9, A-Z
TSX ; copy stack pointer to x
LDAA 3,X
SUBA #$30 ; ascii zero
BMI DIGIT2 ; if less than @@0@@, ILLEGAL
CMPA #$0A
BMI DIGIT0 ; if @@9@@ or less
CMPA #$11
BMI DIGIT2 ; if less than "A"
CMPA #$2B
BPL DIGIT2 ; if greater than "Z"
SUBA #7 ; translate "A" thru "F"
DIGIT0 CMPA 1,X
BPL DIGIT2 ; if not less than the base
LDAB #1 ; set flag
STAA 3,X ; store digit
DIGIT1 STAB 1,X ; store the flag
JMP NEXT
DIGIT2 CLRB ;
INS
INS ; pop bottom number
TSX ;
STAB 0,X ; make sure both bytes are 00
BRA DIGIT1
*
* the word format in the dictionary is :
*
* NFA char-count + 80 lowest address
* char 1
* char 2
*
* char n + $80
*
* LFA link high byte \___ point to previous word
* link low byte /
*
* CFA CFA high byte \___ point to 6800 code
* CFA low byte /
*
* PFA parameter fields
* " "
* " "
*
*
*=======>> 11 << (FIND)
*
FCB $86
FCC '(FIND'
FCB $A9
FDB DIGIT-8
PFIND FDB *+2
NOP
NOP
PD EQU N ; pointer to dict word being checked
PA0 EQU N+2
PA EQU N+4
PC EQU N+6
LDX #PD
LDAB #4
PFIND0 PULA ; loop to get arguments off stack
STAA 0,X
INX
DECB
BNE PFIND0
LDX PD
PFIND1 LDAB 0,X ; get count dict count
STAB PC
ANDB #$3F
INX
STX PD ; update PD
LDX PA0
LDAA 0,X ; get count from arg
INX
STX PA ; initialize PA
CBA ; compare lengths
BNE PFIND4
PFIND2 LDX PA
LDAA 0,X
INX
STX PA
LDX PD
LDAB 0,X
INX
STX PD
TSTB ; is dict entry neg. ?
BPL PFIND8
ANDB #$7F ; clear sign
CBA
BEQ FOUND
PFIND3 LDX 0,X ; get new link
BNE PFIND1 ; continue if link not = 0
*
* not found
*
CLRA
CLRB
JMP PUSHBA
PFIND8 CBA
BEQ PFIND2
PFIND4 LDX PD
PFIND9 LDAB 0,X ; scan forward to end of this name
INX
BPL PFIND9 ; read until bit 7 is found set
BRA PFIND3
*
*
*
FOUND LDD PD ; compute CFA
ADDD #4 ;
PSHB ; and push on stack
PSHA
LDAA PC ; push dictionary count
PSHA
CLRA
PSHA ; with upper 8 bits zero
LDAB #1 ; construct a true flag
JMP PUSHBA ; and go push on stack
*
*=======>> 12 << ENCLOSE
*
FCB $87
FCC 'ENCLOS'
FCB $C5
FDB PFIND-9
*
* FC means offset (bytes) to first character of next word
* EW " " @@@ to end of word
* NC " " @@@ to next character to start next enclose at
*
ENCLOS FDB *+2
INS
PULB ; now, get low byte, for an 8 bit delimiter
TSX ; copy stack pointer
LDX 0,X ; get address to start enclose at
CLR N ; clear counter
*
* wait for a non-delimiter or a NUL
*
ENCL2 LDAA 0,X ; get a character
BEQ ENCL6 ; found null
CBA ; is it the delimiter ?
BNE ENCL3 ; yes
INX ; no
INC N ; bump count
BRA ENCL2 ; try it again
*
* found first character. Push FC
*
ENCL3 LDAA N ; found first character
PSHA ; push count
CLRA
PSHA ; push $00
*
* wait for a delimiter or a NUL
*
ENCL4 LDAA 0,X ; get another character
BEQ ENCL7 ; it@@s a null
CBA ; check for a delimiter
BEQ ENCL5 ; yes - it is the delimiter
INX ; no
INC N ; increment count
BRA ENCL4 ; see if we can find it somewhere
*
* found end of word
*
ENCL5 LDAB N ; get count
CLRA ; upper 8 = 0
PSHB ; push EW
PSHA
*
* advance and push NC
*
INCB ; increment
JMP PUSHBA
*
* found NUL before non-delimiter, therefore there is no word
*
ENCL6 LDAB N ; found NUL
PSHB
PSHA
INCB
BRA ENCL7+2 ;
*
* found NUL following the word instead of SPACE
*
ENCL7 LDAB N ;
PSHB
PSHA
ENCL8 LDAB N ;
JMP PUSHBA
*
* the next 4 words call system dependent I/O subroutines
* which are listed after "-->" in the dictionary
*
*=======>> 13 << EMIT
*
FCB $84
FCC 'EMI'
FCB $D4
FDB ENCLOS-10
EMIT FDB *+2
PULA ; get data
PULA
STAB N ; save B
STX N+1 ; save X
*
EMIT1 LDAB SCSR ; read status
BITB #$40
BEQ EMIT1 ;
ANDA #$7F ; mask parity
STAA SCDAT ; send character
LDAB N ; recover B & X
LDX N+1
JMP NEXT ;
*
*=======>> 14 << KEY
*
FCB $83
FCC 'KE'
FCB $D9
FDB EMIT-7
KEY FDB *+2
STAB N ; save b and x
STX N+1
*
INSCI LDAA SCSR ; read status reg
ANDA #$20
BEQ INSCI ; jump if rdrf=0
LDAA SCDAT ; read data register
ANDA #$7F ; mask parity
LDAB N ; restore b and x
LDX N+1
PSHA ; push data byte
CLRA
PSHA ; push a zero byte
JMP NEXT
*
*=======>> 15 << ?TERMINAL
*
FCB $89
FCC '?TERMINA'
FCB $CC
FDB KEY-6
QTERM FDB *+2
LDAA SCSR
ANDA #$20 ; rdrf set ?
BEQ QTERM1
LDAA SCDAT ; yes - read data to clear it
LDAA #$01 ; flag = true
BRA QTERM2
QTERM1 CLRA ; flag = false
QTERM2 CLRB
JMP PUSHBA ; stack the flag
*
*=======>> 16 << CR
*
FCB $82
FCC 'C'
FCB $D2
FDB QTERM-12
CR FDB *+2
LDAA #$D ; carriage return
CR1 LDAB SCSR ; read status
BITB #$40
BEQ CR1 ; loop until tC=1
ANDA #$7F ; mask parity
STAA SCDAT ; send character
LDAA #$A ; line feed
CR2 LDAB SCSR ; read status
BITB #$40
BEQ CR2 ; loop until tC=1
ANDA #$7F ; mask parity
STAA SCDAT ; send character
JMP NEXT
*
*=======>> 17 << CMOVE ; source, destination, count
*
FCB $85
FCC 'CMOV'
FCB $C5
FDB CR-5
CMOVE FDB *+2 ;
LDX #N ; find temp storage area
LDAB #6 ; byte count
*
* n = count ; n+2 = destination ; n+4 = source
*
CMOV1 PULA ; pop 6 bytes off stack
STAA 0,X ; move parameters to scratch area
INX ;
DECB
BNE CMOV1
CMOV2 LDD N ; get count
SUBD #1 ; subtract one
STD N ; save count
BCS CMOV3 ; we be done ?
LDX N+4 ; get source address
LDAA 0,X ; get source data
INX
STX N+4 ; save source pointer
LDX N+2 ; get destination pointer
STAA 0,X ; write it to destination
INX
STX N+2 ; save destination pointer
_CMOV2 BRA CMOV2
CMOV3 JMP NEXT
*
*=======>> 18 << U*
*
FCB $82
FCC 'U'
FCB $AA
FDB CMOVE-8
USTAR FDB *+2
LDAA #16 ; bits/word counter
PSHA
CLRA
CLRB
TSX
USTAR2 ROR 3,X ; shift multiplier
ROR 4,X
DEC 0,X ; done ?
BMI USTAR4 ; yes
BCC USTAR3
ADDD 1,X
USTAR3 RORA
RORB ; shift result
BRA USTAR2
USTAR4 INS ; dump counter
INS
INS
JMP PUSHBA ; leave high word
*
*
*
*=======>> 19 << U/
*
FCB $82
FCC 'U'
FCB $AF
FDB USTAR-5
USLASH FDB *+2
LDAA #17
PSHA
TSX
LDD 3,X
USL1 CMPA 1,X
BHI USL3
BCS USL2
CMPB 2,X
BCC USL3
USL2 CLC
BRA USL4
USL3 SUBD 1,X
SEC
USL4 ROL 6,X
ROL 5,X
DEC 0,X
BEQ USL5
ROLB
ROLA
BCC USL1
BRA USL3
USL5 INS
INS
INS
INS
INS
JMP SWAP+4 ; reverse quotient and remainder
*
*=======>> 20 << AND
*
FCB $83
FCC 'AN'
FCB $C4
FDB USLASH-5
AND FDB *+2
PULA ; pop data off stack
PULB
TSX ; copy stack pointer
ANDB 1,X ; AND the D acc with data on stack
ANDA 0,X
JMP STABX ; go save result
*
*=======>> 21 << OR
*
FCB $82
FCC 'O'
FCB $D2
FDB AND-6
OR FDB *+2
PULA ; pop data off stack
PULB
TSX ; copy stack pointer
ORAB 1,X ; OR the D acc with data on stack
ORAA 0,X
JMP STABX ; go save result
*
*=======>> 22 << XOR
*
FCB $83
FCC 'XO'
FCB $D2
FDB OR-5
XOR FDB *+2
PULA ; pop data
PULB
TSX ; copy stack pointer
EORB 1,X ; XOR the D acc with data on stack
EORA 0,X
JMP STABX ; go save result
*
* SP@
*
FCB $83
FCC 'SP'
FCB $C0
FDB XOR-6
SPAT FDB *+2
TSX ; copy stack pointer
STX N ; save in scratch area
LDX #N ; this doesn@@t make sense to me !!
JMP GETX
*
*=======>> 24 << SP!
*
FCB $83
FCC 'SP'
FCB $A1
FDB SPAT-6
SPSTOR FDB *+2
LDX UP ; get user pointer
LDX XSPZER-UORIG,X ; find initialization value for sp
TXS ; watch it! X and S are not equal
JMP NEXT
*
*=======>> 25 << RP!
*
FCB $83
FCC 'RP'
FCB $A1
FDB SPSTOR-6
RPSTOR FDB *+2
LDX RINIT ; initialize from rom constant
STX RP ; save new return pointer
JMP NEXT
*
*=======>> 26 << ;S
*
FCB $82
FCC ';'
FCB $D3
FDB RPSTOR-6
SEMIS FDB *+2
LDX RP ; get return pointer
INX
INX
STX RP ;
LDX 0,X ; get address we have just finished
JMP NEXT+2 ; increment the return address & do next word
*
*=======>> 27 << LEAVE
*
FCB $85
FCC 'LEAV'
FCB $C5
FDB SEMIS-5
LEAVE FDB *+2
LDX RP ;
LDD 2,X
STD 4,X ;
JMP NEXT
*
*=======>> 28 << >R
*
FCB $82
FCC '>'
FCB $D2
FDB LEAVE-8
TOR FDB *+2
LDX RP ; find return stack
DEX ; make room on return stack
DEX
STX RP ;
PULA ; pop data
PULB
STD 2,X ; and save on return stack
JMP NEXT
*
*=======>> 29 << R>
*
FCB $82
FCC 'R'
FCB $BE
FDB TOR-5
FROMR FDB *+2
LDX RP ; find return stack
LDD 2,X ; get data
INX ; toss out 2 bytes
INX
STX RP ; save pointer
JMP PUSHBA ; push data back on stack
*
*=======>> 30 << R
*
FCB $81 ; R
FCB $D2
FDB FROMR-5
R FDB *+2
LDX RP ; find pointer
INX
INX
JMP GETX ; copy data and push on data stack
*
*=======>> 31 << 0=
*
FCB $82
FCC '0'
FCB $BD
FDB R-4
ZEQU FDB *+2
TSX ; copy stack pointer
CLRA
CLRB
LDX 0,X ; now get data off stack
BNE ZEQU2 ; not zero so leave false flag
INCB ; it is zero so leave true flag
ZEQU2 TSX ;
JMP STABX ; save flag
*
*=======>> 32 << 0<
*
FCB $82
FCC '0'
FCB $BC
FDB ZEQU-5
ZLESS FDB *+2
TSX ; copy stack pointer
LDAA #$80 ; check the sign bit
ANDA 0,X ;
BEQ ZLESS2
CLRA ; if negative
LDAB #1 ; leave true flag as it is less than zero
JMP STABX
ZLESS2 CLRB ; leave false - it@@s greater than zero
JMP STABX
*
*=======>> 33 << +
*
FCB $81 ; +
FCB $AB
FDB ZLESS-5
PLUS FDB *+2
PULA ; pop data
PULB
TSX ; copy stack pointer
ADDD 0,X ; add two words
JMP STABX ; and leave result on stack
*
*=======>> 34 << D+
*
FCB $82
FCC 'D'
FCB $AB
FDB PLUS-4
DPLUS FDB *+2
TSX ; copy stack pointer
CLC
LDAB #4 ; double word is 4 bytes
DPLUS2 LDAA 3,X ; point to byte of bottom
ADCA 7,X ; add to byte of top
STAA 7,X ; save result
DEX ;
DECB ; knock down count
BNE DPLUS2 ; do until 4 bytes complete
INS ; toss 2 words
INS
INS
INS
JMP NEXT ;
*
*=======>> 35 << MINUS ; change sign of word on stack
*
FCB $85
FCC 'MINU'
FCB $D3
FDB DPLUS-5
MINUS FDB *+2
TSX ; copy stack pointer
NEG 1,X ; negate bottom byte
BCS MINUS2
NEG 0,X ; negate upper byte
BRA MINUS3
MINUS2 COM 0,X ;
MINUS3 JMP NEXT
*
*=======>> 36 << DMINUS ; change sign of double word on stack
*
FCB $86
FCC 'DMINU'
FCB $D3
FDB MINUS-8
DMINUS FDB *+2
TSX ; copy stack pointer
COM 0,X
COM 1,X
COM 2,X
NEG 3,X
BNE DMINX ; figure this out later
INC 2,X
BNE DMINX
INC 1,X
BNE DMINX
INC 0,X
DMINX JMP NEXT
*
*=======>> 37 << OVER
*
FCB $84
FCC 'OVE'
FCB $D2
FDB DMINUS-9
OVER FDB *+2
TSX ; copy stack pointer
LDD 2,X ; get second word on stack
JMP PUSHBA ; and copy it to top
*
*=======>> 38 << DROP
*
FCB $84
FCC 'DRO'
FCB $D0
FDB OVER-7
DROP FDB *+2
INS ; knock sp twice
INS ; to remove top item froom stack
JMP NEXT
*
*=======>> 39 << SWAP
*
FCB $84
FCC 'SWA'
FCB $D0
FDB DROP-7
SWAP FDB *+2
PULA ; get top item of stack
PULB
TSX ; copy sp
LDX 0,X ; copy second item
INS
INS
PSHB ; save top item as second item
PSHA
STX N ; now go save second as top
LDX #N
JMP GETX
*
*=======>> 40 << DUP
*
FCB $83
FCC 'DU'
FCB $D0
FDB SWAP-7
DUP FDB *+2
PULA ; get data
PULB
PSHB ; push data
PSHA
JMP PUSHBA ; push it again to duplicate
*
*=======>> 41 << +!
*
FCB $82
FCC '+'
FCB $A1
FDB DUP-6
PSTORE FDB *+2
TSX ; copy stack pointer
LDX 0,X ; get address
INS
INS
PULA ; get data from stack
PULB
ADDB 1,X ; add and store low byte
STAB 1,X
ADCA 0,X ; add and store high byte
STAA 0,X
JMP NEXT
*
*=======>> 42 << TOGGLE
*
FCB $86
FCC 'TOGGL'
FCB $C5
FDB PSTORE-5
TOGGLE FDB DOCOL,OVER,CAT,XOR,SWAP,CSTORE
FDB SEMIS
*
*=======>> 43 << @
*
FCB $81 ; @
FCB $C0
FDB TOGGLE-9
AT FDB *+2
TSX ; copy sp
LDX 0,X ; get address
INS
INS
JMP GETX ; get 16 bit data from address
*
*=======>> 44 << C@
*
FCB $82
FCC 'C'
FCB $C0
FDB AT-4
CAT FDB *+2
TSX ; copy sp
LDX 0,X ; get address
CLRA ; make upper byte zero
LDAB 0,X ; get 8 bit data from address
INS
INS
JMP PUSHBA ; and save on stack
*
*=======>> 45 << !
*
FCB $81 ; !
FCB $A1
FDB CAT-5
STORE FDB *+2
TSX
LDX 0,X ; get address
INS
INS
JMP PULABX ; then get data and store at addr
*
*=======>> 46 << C!
*
FCB $82
FCC 'C'
FCB $A1
FDB STORE-4
CSTORE FDB *+2
TSX ; copy stack pointer
LDX 0,X ; get address
INS
INS
INS
PULB ; get 8 bit data
STAB 0,X ; and store it
JMP NEXT
*
*=======>> 47 << :
*
FCB $C1
FCB $BA
FDB CSTORE-5
COLON FDB DOCOL,QEXEC,SCSP,CURENT,AT,CONTXT,STORE
FDB CREATE,RBRAK
FDB PSCODE
*
* here is the IP pusher for allowing nested words
* in the virtual machine
* ( ;S is the equivalent un-nester)
*
*
DOCOL LDX RP ; make room in the stack
DEX
DEX
STX RP
LDD IP ; get instruction pointer
STD 2,X ; store address of the high level word
LDX W ; get first sub-word of that definition
JMP NEXT+2 ; and execute it
*
* >> 48 << ;
*
FCB $C1 ; immediate code
FCB $BB
FDB COLON-4
SEMI FDB DOCOL,QCSP,COMPIL,SEMIS,SMUDGE,LBRAK
FDB SEMIS
*
*=======>> 49 << CONSTANT
*
FCB $88
FCC 'CONSTAN'
FCB $D4
FDB SEMI-4
CON FDB DOCOL,CREATE,SMUDGE,COMMA,PSCODE
DOCON LDX W ; pointer
LDD 2,X ; get constant data
JMP PUSHBA ; and save it
*
*=======>> 50 << VARIABLE
*
FCB $88
FCC 'VARIABL'
FCB $C5
FDB CON-11
VAR FDB DOCOL,CON,PSCODE
DOVAR LDD W ; pointer to parameter field
ADDD #2 ; A:B now contain the address of the variable
JMP PUSHBA
*
*=======>> 51 << USER
*
FCB $84
FCC 'USE'
FCB $D2
FDB VAR-11
USER FDB DOCOL,CON,PSCODE
DOUSER LDX W ; get offset into user@@s table
LDD 2,X
ADDD UP
JMP PUSHBA ; push address of user@@s variable
*
*=======>> 52 << 0
*
FCB $81 ; 0
FCB $B0
FDB USER-7
ZERO FDB DOCON
FDB 0000
*
*=======>> 53 << 1
*
FCB $81 ; 1
FCB $B1
FDB ZERO-4
ONE FDB DOCON
FDB 1
*
*=======>> 54 << 2
*
FCB $81 ; 2
FCB $B2
FDB ONE-4
TWO FDB DOCON
FDB 2
*
*=======>> 55 << 3
*
FCB $81 ;3
FCB $B3
FDB TWO-4
THREE FDB DOCON
FDB 3
*
*=======>> 56 << BL
*
FCB $82
FCC 'B'
FCB $CC
FDB THREE-4
BL FDB DOCON ; ascii blank
FDB $20
*
*=======>> 57 << FIRST
*
FCB $85
FCC 'FIRS'
FCB $D4
FDB BL-5
FIRST FDB DOCON
FDB RAMTOP ;
*
*=======>> 58 << LIMIT ; the end of memory +1
*
FCB $85
FCC 'LIMI'
FCB $D4
FDB FIRST-8
LIMIT FDB DOCON
FDB MEMEND ;
*
*=======>> 59 << B/BUF ; 256 bytes/buffer
*
FCB $85
FCC 'B/BU'
FCB $C6
FDB LIMIT-8
BBUF FDB DOCON
FDB 256
*
*=======>> 60 << B/SCR ; blocks/screen = 1024/(B/BUF) = 4
* ;
FCB $85
FCC 'B/SC'
FCB $D2
FDB BBUF-8
BSCR FDB DOCON
FDB 4
*
*=======>> 61 << +ORIGIN
*
FCB $87
FCC '+ORIGI'
FCB $CE
FDB BSCR-8
PORIG FDB DOCOL,LIT,ORIG,PLUS
FDB SEMIS
*
*=======>> 62 << S0
*
FCB $82
FCC 'S'
FCB $B0
FDB PORIG-10
SZERO FDB DOUSER
FDB XSPZER-UORIG
*
*=======>> 63 << R0
*
FCB $82
FCC 'R'
FCB $B0
FDB SZERO-5
RZERO FDB DOUSER
FDB XRZERO-UORIG
*
*=======>> 64 << TIB
*
FCB $83
FCC 'TI'
FCB $C2
FDB RZERO-5
TIB FDB DOUSER
FDB XTIB-UORIG
*
*=======>> 65 << WIDTH
*
FCB $85
FCC 'WIDT'
FCB $C8
FDB TIB-6
WIDTH FDB DOUSER
FDB XWIDTH-UORIG
*
*=======>> 66 << WARNING
*
FCB $87
FCC 'WARNIN'
FCB $C7
FDB WIDTH-8
WARN FDB DOUSER
FDB XWARN-UORIG
*
*=======>> 67 << FENCE
*
FCB $85
FCC 'FENC'
FCB $C5
FDB WARN-10
FENCE FDB DOUSER
FDB XFENCE-UORIG
*
*=======>> 68 DP pointer to first free
* byte at end of dictionary
*
FCB $82
FCC 'D'
FCB $D0
FDB FENCE-8
DP FDB DOUSER
FDB XDP-UORIG
*
*=======>> 68.5 << VOC-LINK
*
FCB $88
FCC 'VOC-LIN'
FCB $CB
FDB DP-5
VOCLIN FDB DOUSER
FDB XVOCL-UORIG
*
*=======>> 69 << BLK
*
FCB $83
FCC 'BL'
FCB $CB
FDB VOCLIN-11
BLK FDB DOUSER
FDB XBLK-UORIG
*
*=======>> 70 << IN ; scan pointer for input line buffer
*
FCB $82
FCC 'I'
FCB $CE
FDB BLK-6
IN FDB DOUSER
FDB XIN-UORIG
*
*=======>> 71 << OUT
*
FCB $83
FCC 'OU'
FCB $D4
FDB IN-5
OUT FDB DOUSER
FDB XOUT-UORIG
*
*=======>> 72 << SCR
*
FCB $83
FCC 'SC'
FCB $D2
FDB OUT-6
SCR FDB DOUSER
FDB XSCR-UORIG
*
*=======>> 73 << OFFSET
*
FCB $86
FCC 'OFFSE'
FCB $D4
FDB SCR-6
OFSET FDB DOUSER
FDB XOFSET-UORIG
*
*=======>> 74 << CONTEXT ; points to pointer to
* ; vocabulary to search first
FCB $87
FCC 'CONTEX'
FCB $D4
FDB OFSET-9
CONTXT FDB DOUSER
FDB XCONT-UORIG
*
*=======>> 75 << CURRENT ; points to pointer to
* ; vocabulary being extended
FCB $87
FCC 'CURREN'
FCB $D4
FDB CONTXT-10
CURENT FDB DOUSER
FDB XCURR-UORIG
*
*=======>> 76 << STATE ; 1 if compiling, 0 if not
*
FCB $85
FCC 'STAT'
FCB $C5
FDB CURENT-10
STATE FDB DOUSER
FDB XSTATE-UORIG
*
*=======>> 77 << BASE ; number base for all input and output
*
FCB $84
FCC 'BAS'
FCB $C5
FDB STATE-8
BASE FDB DOUSER
FDB XBASE-UORIG
*
*=======>> 78 << DPL
*
FCB $83
FCC 'DP'
FCB $CC
FDB BASE-7
DPL FDB DOUSER
FDB XDPL-UORIG
*
*=======>> 79 << FLD
*
FCB $83
FCC 'FL'
FCB $C4
FDB DPL-6
FLD FDB DOUSER
FDB XFLD-UORIG
*
*=======>> 80 << CSP
*
FCB $83
FCC 'CS'
FCB $D0
FDB FLD-6
CSP FDB DOUSER
FDB XCSP-UORIG
*
*=======>> 81 << R#
*
FCB $82
FCC 'R'
FCB $A3
FDB CSP-6
RNUM FDB DOUSER
FDB XRNUM-UORIG
*
*=======>> 82 << HLD
*
FCB $83
FCC 'HL'
FCB $C4
FDB RNUM-5
HLD FDB DOCON
FDB XHLD
*
*=======>> 82.5 << COLUMNS ; line width of terminal
*
FCB $87
FCC 'COLUMN'
FCB $D3
FDB HLD-6
COLUMS FDB DOUSER
FDB XCOLUM-UORIG
*
*=======>> 83 << 1+
*
FCB $82
FCC '1'
FCB $AB
FDB COLUMS-10
ONEP FDB DOCOL,ONE,PLUS
FDB SEMIS
*
*=======>> 84 << 2+
*
FCB $82
FCC '2'
FCB $AB
FDB ONEP-5
TWOP FDB DOCOL,TWO,PLUS
FDB SEMIS
*
*=======>> 85 << HERE
*
FCB $84
FCC 'HER'
FCB $C5
FDB TWOP-5
HERE FDB DOCOL,DP,AT
FDB SEMIS
*
*=======>> 86 << ALLOT
*
FCB $85
FCC 'ALLO'
FCB $D4
FDB HERE-7
ALLOT FDB DOCOL,DP,PSTORE
FDB SEMIS
*
*=======>> 87 << , ( this is a comma )
*
FCB $81 ; , (comma)
FCB $AC
FDB ALLOT-8
COMMA FDB DOCOL,HERE,STORE,TWO,ALLOT
FDB SEMIS
*
*=======>> 88 << C,
*
FCB $82
FCC 'C'
FCB $AC
FDB COMMA-4
CCOMM FDB DOCOL,HERE,CSTORE,ONE,ALLOT
FDB SEMIS
*
*=======>> 89 << - ( minus sign )
*
FCB $81 ; -
FCB $AD
FDB CCOMM-5
SUB FDB DOCOL,MINUS,PLUS
FDB SEMIS
*
*=======>> 90 << = ( equals sign )
*
FCB $81 ; =
FCB $BD
FDB SUB-4
EQUAL FDB DOCOL,SUB,ZEQU
FDB SEMIS
*
*=======>> 91 << < ( left arrow )
*
FCB $81 ; <
FCB $BC
FDB EQUAL-4
LESS FDB *+2
PULA ; pop data
PULB
TSX ; copy stack pointer
CMPA 0,X ; compare upper bytes
INS
BGT LESST ;
BNE LESSF
CMPB 1,X
BHI LESST
LESSF CLRB ; set flag false
BRA LESSX
LESST LDAB #1 ; set flag true
LESSX CLRA
INS
JMP PUSHBA
*
*=======>> 92 << > ( right arrow )
*
FCB $81 ; >
FCB $BE
FDB LESS-4
GREAT FDB DOCOL,SWAP,LESS
FDB SEMIS
*
*=======>> 93 << ROT
*
FCB $83
FCC 'RO'
FCB $D4
FDB GREAT-4
ROT FDB DOCOL,TOR,SWAP,FROMR,SWAP
FDB SEMIS
*
*=======>> 94 << SPACE
*
FCB $85
FCC 'SPAC'
FCB $C5
FDB ROT-6
SPACE FDB DOCOL,BL,EMIT
FDB SEMIS
*
*=======>> 95 << MIN
*
FCB $83
FCC 'MI'
FCB $CE
FDB SPACE-8
MIN FDB DOCOL,OVER,OVER,GREAT,ZBRAN
FDB MIN2-*
FDB SWAP
MIN2 FDB DROP
FDB SEMIS
*
*=======>> 96 << MAX
*
FCB $83
FCC 'MA'
FCB $D8
FDB MIN-6
MAX FDB DOCOL,OVER,OVER,LESS,ZBRAN
FDB MAX2-*
FDB SWAP
MAX2 FDB DROP
FDB SEMIS
*
*=======>> 97 << -DUP
*
FCB $84
FCC '-DU'
FCB $D0
FDB MAX-6
DDUP FDB DOCOL,DUP,ZBRAN
FDB DDUP2-*
FDB DUP
DDUP2 FDB SEMIS
*
*=======>> 98 << TRAVERSE
*
FCB $88
FCC 'TRAVERS'
FCB $C5
FDB DDUP-7
TRAV FDB DOCOL,SWAP
TRAV2 FDB OVER,PLUS,LIT
FDB $7F
FDB OVER,CAT,LESS,ZBRAN
FDB TRAV2-*
FDB SWAP,DROP
FDB SEMIS
*
*=======>> 99 << LATEST
*
FCB $86
FCC 'LATES'
FCB $D4
FDB TRAV-11
LATEST FDB DOCOL,CURENT,AT,AT
FDB SEMIS
*
*=======>> 100 << LFA
*
FCB $83
FCC 'LF'
FCB $C1
FDB LATEST-9
LFA FDB DOCOL,LIT
FDB 4
FDB SUB
FDB SEMIS
*
*=======>> 101 << CFA
*
FCB $83
FCC 'CF'
FCB $C1
FDB LFA-6
CFA FDB DOCOL,TWO,SUB
FDB SEMIS
*
*=======>> 102 << NFA
*
FCB $83
FCC 'NF'
FCB $C1
FDB CFA-6
NFA FDB DOCOL,LIT
FDB 5
FDB SUB,ONE,MINUS,TRAV
FDB SEMIS
*
*=======>> 103 << PFA
*
FCB $83
FCC 'PF'
FCB $C1
FDB NFA-6
PFA FDB DOCOL,ONE,TRAV,LIT
FDB 5
FDB PLUS
FDB SEMIS
*
*=======>> 104 << !CSP
*
FCB $84
FCC '!CS'
FCB $D0
FDB PFA-6
SCSP FDB DOCOL,SPAT,CSP,STORE
FDB SEMIS
*
*=======>> 105 << ?ERROR
*
FCB $86
FCC '?ERRO'
FCB $D2
FDB SCSP-7
QERR FDB DOCOL,SWAP,ZBRAN
FDB QERR2-*
FDB ERROR,BRAN
FDB QERR3-*
QERR2 FDB DROP
QERR3 FDB SEMIS
*
*=======>> 106 << ?COMP
*
FCB $85
FCC '?COM'
FCB $D0
FDB QERR-9
QCOMP FDB DOCOL,STATE,AT,ZEQU,LIT
FDB $11
FDB QERR
FDB SEMIS
*
*=======>> 107 << ?EXEC
*
FCB $85
FCC '?EXE'
FCB $C3
FDB QCOMP-8
QEXEC FDB DOCOL,STATE,AT,LIT
FDB $12
FDB QERR
FDB SEMIS
*
*=======>> 108 << ?PAIRS
*
FCB $86
FCC '?PAIR'
FCB $D3
FDB QEXEC-8
QPAIRS FDB DOCOL,SUB,LIT
FDB $13
FDB QERR
FDB SEMIS
*
*=======>> 109 << ?CSP
*
FCB $84
FCC '?CS'
FCB $D0
FDB QPAIRS-9
QCSP FDB DOCOL,SPAT,CSP,AT,SUB,LIT
FDB $14
FDB QERR
FDB SEMIS
*
*=======>> 110 << ?LOADING
*
FCB $88
FCC '?LOADIN'
FCB $C7
FDB QCSP-7
QLOAD FDB DOCOL,BLK,AT,ZEQU,LIT
FDB $16
FDB QERR
FDB SEMIS
*
*=======>> 111 << COMPILE
*
FCB $87
FCC 'COMPIL'
FCB $C5
FDB QLOAD-11
COMPIL FDB DOCOL,QCOMP,FROMR,TWOP,DUP,TOR,AT,COMMA
FDB SEMIS
*
*=======>> 112 << [
*
FCB $C1 ; [ immediate
FCB $DB
FDB COMPIL-10
LBRAK FDB DOCOL,ZERO,STATE,STORE
FDB SEMIS
*
*=======>> 113 << ]
*
FCB $81 ; ]
FCB $DD
FDB LBRAK-4
RBRAK FDB DOCOL,LIT
FDB $C0
FDB STATE,STORE
FDB SEMIS
*
*=======>> 114 << SMUDGE
*
FCB $86
FCC 'SMUDG'
FCB $C5
FDB RBRAK-4
SMUDGE FDB DOCOL,LATEST,LIT
FDB $20
FDB TOGGLE
FDB SEMIS
*
*=======>> 115 << HEX
*
FCB $83
FCC 'HE'
FCB $D8
FDB SMUDGE-9
HEX FDB DOCOL
FDB LIT
FDB 16
FDB BASE,STORE
FDB SEMIS
*
*=======>> 116 << DECIMAL
*
FCB $87
FCC 'DECIMA'
FCB $CC
FDB HEX-6
DEC FDB DOCOL
FDB LIT
FDB 10
FDB BASE,STORE
FDB SEMIS
*
*=======>> 117 << (;CODE)
*
FCB $87
FCC '(;CODE'
FCB $A9
FDB DEC-10
PSCODE FDB DOCOL,FROMR,TWOP,LATEST,PFA,CFA,STORE
FDB SEMIS
*
*=======>> 118 << ;CODE
*
FCB $C5
FCC ';COD'
FCB $C5
FDB PSCODE-10
SEMIC FDB DOCOL,QCSP,COMPIL,PSCODE,SMUDGE,LBRAK,QSTACK
FDB SEMIS
*
* note : `QSTACK` will be replaced by `ASSEMBLER` later
*
*=======>> 119 << <BUILDS
*
FCB $87
FCC '<BUILD'
FCB $D3
FDB SEMIC-8
BUILDS FDB DOCOL,ZERO,CON
FDB SEMIS
*
*=======>> 120 << DOES>
*
FCB $85
FCC 'DOES'
FCB $BE
FDB BUILDS-10
DOES FDB DOCOL,FROMR,TWOP,LATEST,PFA,STORE
FDB PSCODE
*
DODOES LDD IP ; get instruction pointer
LDX RP ; get return pointer
DEX
DEX
STX RP ; save rp
STD 2,X
LDX W ;
INX
INX
STX N
LDX 0,X
STX IP ;
CLRA
LDAB #2
ADDD N
PSHB
PSHA
JMP NEXT2
*
*=======>> 121 << COUNT
*
FCB $85
FCC 'COUN'
FCB $D4
FDB DOES-8
COUNT FDB DOCOL,DUP,ONEP,SWAP,CAT
FDB SEMIS
*
*=======>> 122 << TYPE
*
FCB $84
FCC 'TYP'
FCB $C5
FDB COUNT-8
TYPE FDB DOCOL,DDUP,ZBRAN
FDB TYPE3-*
FDB OVER,PLUS,SWAP,XDO1
TYPE2 FDB I,CAT,EMIT,XLOOP
FDB TYPE2-*
FDB BRAN
FDB TYPE4-*
TYPE3 FDB DROP
TYPE4 FDB SEMIS
*
*=======>> 123 << -TRAILING
*
FCB $89
FCC '-TRAILIN'
FCB $C7
FDB TYPE-7
DTRAIL FDB DOCOL,DUP,ZERO,XDO1
DTRAL2 FDB OVER,OVER,PLUS,ONE,SUB,CAT,BL
FDB SUB,ZBRAN
FDB DTRAL3-*
FDB LEAVE,BRAN
FDB DTRAL4-*
DTRAL3 FDB ONE,SUB
DTRAL4 FDB XLOOP
FDB DTRAL2-*
FDB SEMIS
*
*=======>> 124 << (.@@@)
*
FCB $84
FCC '(."'
FCB $A9
FDB DTRAIL-12
PDOTQ FDB DOCOL,R,TWOP,COUNT,DUP,ONEP
FDB FROMR,PLUS,TOR,TYPE
FDB SEMIS
*
*=======>> 125 << .@@@
*
FCB $C2
FCC '.'
FCB $A2
FDB PDOTQ-7
DOTQ FDB DOCOL
FDB LIT
FDB $22
FDB STATE,AT,ZBRAN
FDB DOTQ1-*
FDB COMPIL,PDOTQ,WORD
FDB HERE,CAT,ONEP,ALLOT,BRAN
FDB DOTQ2-*
DOTQ1 FDB WORD,HERE,COUNT,TYPE
DOTQ2 FDB SEMIS
*
*=======>> 126 << ?STACK MACHINE DEPENDENT
*
FCB $86
FCC '?STAC'
FCB $CB
FDB DOTQ-5
QSTACK FDB DOCOL,LIT
FDB $12
FDB PORIG,AT,TWO,SUB,SPAT,LESS,ONE
FDB QERR
*
* prints 'empty stack'
*
QSTAC2 FDB SPAT
*
* here we compare with a value at least 128
* higher than dict. ptr. (DP)
*
FDB HERE,LIT
FDB $80
FDB PLUS,LESS,ZBRAN
FDB QSTAC3-*
FDB TWO
FDB QERR
*
* prints 'full stack'
*
QSTAC3 FDB SEMIS
*
*=======>> 128 << EXPECT
*
FCB $86
FCC 'EXPEC'
FCB $D4
FDB QSTACK-9
EXPECT FDB DOCOL,OVER,PLUS,OVER,XDO1
EXPEC2 FDB KEY,DUP,LIT
FDB $0E
FDB PORIG,AT,EQUAL,ZBRAN
FDB EXPEC3-*
FDB DROP,LIT
FDB 8
FDB OVER,I,EQUAL,DUP,FROMR,TWO,SUB,PLUS
FDB TOR,SUB,BRAN
FDB EXPEC6-*
EXPEC3 FDB DUP,LIT
FDB $D
FDB EQUAL,ZBRAN
FDB EXPEC4-*
FDB LEAVE,DROP,BL,ZERO,BRAN
FDB EXPEC5-*
EXPEC4 FDB DUP
EXPEC5 FDB I,CSTORE,ZERO,I,ONEP,STORE
EXPEC6 FDB EMIT,XLOOP
FDB EXPEC2-*
FDB DROP
FDB SEMIS
*
*=======>> 129 << QUERY
*
FCB $85
FCC 'QUER'
FCB $D9
FDB EXPECT-9
QUERY FDB DOCOL
FDB TIB,AT,COLUMS
FDB AT,EXPECT,ZERO,IN,STORE
FDB SEMIS
*
*=======>> 130 << ( null - as in 00 hex )
*
FCB $C1
FCB $80
FDB QUERY-8
NULL FDB DOCOL,BLK,AT,ZBRAN
FDB NULL2-*
FDB ONE,BLK,PSTORE
FDB ZERO,IN,STORE,BLK,AT,BSCR,MOD
FDB ZEQU
* check for end of screen
FDB ZBRAN
FDB NULL1-*
FDB QEXEC,FROMR,DROP
NULL1 FDB BRAN
FDB NULL3-*
NULL2 FDB FROMR,DROP
NULL3 FDB SEMIS
*
*=======>> 133 << FILL
*
FCB $84
FCC 'FIL'
FCB $CC
FDB NULL-4
FILL FDB DOCOL,SWAP,TOR,OVER,CSTORE,DUP,ONEP
FDB FROMR,ONE,SUB,CMOVE
FDB SEMIS
*
*=======>> 134 << ERASE
*
FCB $85
FCC 'ERAS'
FCB $C5
FDB FILL-7
ERASE FDB DOCOL,ZERO,FILL
FDB SEMIS
*
*=======>> 135 << BLANKS
*
FCB $86
FCC 'BLANK'
FCB $D3
FDB ERASE-8
BLANKS FDB DOCOL,BL,FILL
FDB SEMIS
*
*=======>> 136 << HOLD
*
FCB $84
FCC 'HOL'
FCB $C4
FDB BLANKS-9
HOLD FDB DOCOL,LIT,$FFFF,HLD,PSTORE,HLD,AT,CSTORE
FDB SEMIS
*
*=======>> 137 << PAD
*
FCB $83
FCC 'PA'
FCB $C4
FDB HOLD-7
PAD FDB DOCOL,HERE,LIT
FDB $44
FDB PLUS
FDB SEMIS
*
*=======>> 138 << WORD
*
FCB $84
FCC 'WOR'
FCB $C4
FDB PAD-6
WORD FDB DOCOL,BLK,AT,ZBRAN
FDB WORD2-*
FDB BLK,AT,BLOCK,BRAN
FDB WORD3-*
WORD2 FDB TIB,AT
WORD3 FDB IN,AT,PLUS,SWAP,ENCLOS,HERE,LIT
FDB 34
FDB BLANKS,IN,PSTORE,OVER,SUB,TOR,R,HERE
FDB CSTORE,PLUS,HERE,ONEP,FROMR,CMOVE
FDB SEMIS
*
*=======>> 139 << (NUMBER)
*
FCB $88
FCC '(NUMBER'
FCB $A9
FDB WORD-7
PNUMB FDB DOCOL
PNUMB2 FDB ONEP,DUP,TOR,CAT,BASE,AT,DIGIT,ZBRAN
FDB PNUMB4-*
FDB SWAP,BASE,AT,USTAR,DROP,ROT,BASE
FDB AT,USTAR,DPLUS,DPL,AT,ONEP,ZBRAN
FDB PNUMB3-*
FDB ONE,DPL,PSTORE
PNUMB3 FDB FROMR,BRAN
FDB PNUMB2-*
PNUMB4 FDB FROMR
FDB SEMIS
*
*=======>> 140 << NUMBER
*
FCB $86
FCC 'NUMBE'
FCB $D2
FDB PNUMB-11
NUMB FDB DOCOL,ZERO,ZERO,ROT,DUP,ONEP,CAT,LIT
FCB 0
FCC '-'
FDB EQUAL,DUP,TOR,PLUS,LIT,$FFFF
NUMB1 FDB DPL,STORE,PNUMB,DUP,CAT,BL,SUB
FDB ZBRAN
FDB NUMB2-*
FDB DUP,CAT,LIT
FCB 0
FCC '.'
FDB SUB,ZERO,QERR,ZERO,BRAN
FDB NUMB1-*
NUMB2 FDB DROP,FROMR,ZBRAN
FDB NUMB3-*
FDB DMINUS
NUMB3 FDB SEMIS
*
*=======>> 141 << -FIND
*
FCB $85
FCC '-FIN'
FCB $C4
FDB NUMB-9
DFIND FDB DOCOL,BL,WORD,HERE,CONTXT,AT,AT
FDB PFIND,DUP,ZEQU,ZBRAN
FDB DFIND2-*
FDB DROP,HERE,LATEST,PFIND
DFIND2 FDB SEMIS
*
*=======>> 142 << (ABORT)
*
FCB $87
FCC '(ABORT'
FCB $A9
FDB DFIND-8
PABORT FDB DOCOL,ABORT
FDB SEMIS
*
*=======>> 143 << ERROR
*
FCB $85
FCC 'ERRO'
FCB $D2
FDB PABORT-10
ERROR FDB DOCOL,WARN,AT,ZLESS
FDB ZBRAN
*
* WARNING is -1 to abort, 0 to print error number
* and 1 to print error message from disc
*
FDB ERROR2-*
FDB PABORT
ERROR2 FDB HERE,COUNT,TYPE,PDOTQ
FCB 4
FCC ' ? '
FDB MESS,SPSTOR,IN,AT,BLK,AT,QUIT
FDB SEMIS
*
*=======>> 144 << ID.
*
FCB $83
FCC 'ID'
FCB $AE
FDB ERROR-8
IDDOT FDB DOCOL,PAD,LIT
FDB 32
FDB LIT
FDB $5F ; ( underline )
FDB FILL,DUP,PFA,LFA,OVER,SUB,PAD
FDB SWAP,CMOVE,PAD,COUNT,LIT
FDB 31
FDB AND,TYPE,SPACE
FDB SEMIS
*
*=======>> 145 << CREATE
*
FCB $86
FCC 'CREAT'
FCB $C5
FDB IDDOT-6
CREATE FDB DOCOL,DFIND,ZBRAN
FDB CREAT2-*
FDB DROP,CR,PDOTQ
FCB 8
FCC ' redef: '
FDB NFA,IDDOT,LIT
FDB 4
FDB MESS,SPACE
CREAT2 FDB HERE,DUP,CAT,WIDTH,AT,MIN
FDB ONEP,ALLOT,DUP,LIT
FDB $A0
FDB TOGGLE,HERE,ONE,SUB,LIT
FDB $80
FDB TOGGLE,LATEST,COMMA,CURENT,AT,STORE
FDB HERE,TWOP,COMMA
FDB SEMIS
*
*=======>> 146 << [COMPILE]
*
FCB $C9 ; immediate
FCC '[COMPILE'
FCB $DD
FDB CREATE-9
BCOMP FDB DOCOL,DFIND,ZEQU,ZERO,QERR,DROP,CFA,COMMA
FDB SEMIS
*
*=======>> 147 << LITERAL
*
FCB $C7 ; immediate
FCC 'LITERA'
FCB $CC
FDB BCOMP-12
LITER FDB DOCOL,STATE,AT,ZBRAN
FDB LITER2-*
FDB COMPIL,LIT,COMMA
LITER2 FDB SEMIS
*
*=======>> 148 << DLITERAL
*
FCB $C8 ; immediate
FCC 'DLITERA'
FCB $CC
FDB LITER-10
DLITER FDB DOCOL,STATE,AT,ZBRAN
FDB DLITE2-*
FDB SWAP,LITER,LITER
DLITE2 FDB SEMIS
*
*=======>> 149 << INTERPRET
*
FCB $89
FCC 'INTERPRE'
FCB $D4
FDB DLITER-11
INTERP FDB DOCOL
INTER2 FDB DFIND,ZBRAN
FDB INTER5-*
FDB STATE,AT,LESS
FDB ZBRAN
FDB INTER3-*
FDB CFA,COMMA,BRAN
FDB INTER4-*
INTER3 FDB CFA,EXEC
INTER4 FDB BRAN
FDB INTER7-*
INTER5 FDB HERE,NUMB,DPL,AT,ONEP,ZBRAN
FDB INTER6-*
FDB DLITER,BRAN
FDB INTER7-*
INTER6 FDB DROP,LITER
INTER7 FDB QSTACK,BRAN
FDB INTER2-* ; branch always
*
*=======>> 150 << IMMEDIATE
*
FCB $89
FCC 'IMMEDIAT'
FCB $C5
FDB INTERP-12
IMMED FDB DOCOL,LATEST,LIT
FDB $40
FDB TOGGLE
FDB SEMIS
*
*=======>> 151 << VOCABULARY
*
FCB $8A
FCC 'VOCABULAR'
FCB $D9
FDB IMMED-12
VOCAB FDB DOCOL,BUILDS,LIT,$81A0,COMMA,CURENT,AT,CFA
FDB COMMA,HERE,VOCLIN,AT,COMMA,VOCLIN,STORE,DOES
DOVOC FDB TWOP,CONTXT,STORE
FDB SEMIS
*
*=======>> 153 << DEFINITIONS
*
FCB $8B
FCC 'DEFINITION'
FCB $D3
FDB VOCAB-13
DEFIN FDB DOCOL,CONTXT,AT,CURENT,STORE
FDB SEMIS
*
*=======>> 154 << (
*
FCB $C1 ; immediate (
FCB $A8
FDB DEFIN-14
PAREN FDB DOCOL,LIT
FCB 0
FCC ')'
FDB WORD
FDB SEMIS
*
*=======>> 155 << QUIT
*
FCB $84
FCC 'QUI'
FCB $D4
FDB PAREN-4
QUIT FDB DOCOL
FDB ZERO,BLK,STORE,LBRAK
*
* Here is the outer interpreter
* which gets a line of input, does it, prints " OK"
* then repeats :
*
QUIT2 FDB RPSTOR,CR,QUERY,INTERP,STATE,AT,ZEQU
FDB ZBRAN
FDB QUIT3-*
FDB PDOTQ
FCB 3
FCC ' OK'
QUIT3 FDB BRAN
FDB QUIT2-* ; branch always
*
*=======>> 156 << ABORT
*
FCB $85
FCC 'ABOR'
FCB $D4
FDB QUIT-7
ABORT FDB DOCOL,SPSTOR,DEC,QSTACK,CR,MTBUF
FDB RESTR
FDB FIRST,DUP,USE,STORE,PREV,STORE ; added 2/7/90
FDB PDOTQ
FCB 15
FCC ' HCforth v2.0 '
FDB FORTH,DEFIN,CR
FDB QUIT ; branch always
*
*=======>> 157 << COLD
*
* bootstrap code - move rom contents to ram
*
FCB $84
FCC 'COL'
FCB $C4
FDB ABORT-8
COLD FDB *+2
CENT LDS #REND-1 ; top of destination
LDX #ERAM ; top of stuff to move
COLD2 DEX
LDAA 0,X
PSHA ; move TASK and FORTH to ram
CPX #RAM
BNE COLD2
*
LDS #XFENCE-1 ; put stack at a safe place for now
LDX COLINT
STX XCOLUM ; columns
LDX DELINT
STX XDELAY ; delay
LDX VOCINT
STX XVOCL ; vocabulary link
LDX DPINIT
STX XDP ; dictionary pointer
LDX FENCIN
STX XFENCE ; fence
*
WENT LDS #XFENCE-1 ; top of destination
LDX #FENCIN ; top of stuff to move
WARM2 DEX
LDAA 0,X ; get byte
PSHA ; save byte
CPX #SINIT ; done ?
BNE WARM2 ; no
*
LDS SINIT ; load stack pointer
LDX UPINIT ;
STX UP ; init user ram pointer
LDX #ABORT ; get cfa of abort
STX IP ; and save as first instruction
*
* start the virtual machine running
*
JMP RPSTOR+2 ;
*
* here is the stuff that gets copied to ram
*
RAM FDB RAMTOP,RAMTOP,0,0
*
*=======>> 152 <<
*
FCB $C5 ; immediate
FCC 'FORT'
FCB $C8
FDB NOOP-7
RFORTH FDB DODOES,DOVOC,$81A0,TASK-7
FDB 0
FCC '(C) Forth Interest Group, 1979'
*
FCB $84
FCC 'TAS'
FCB $CB
FDB FORTH-8
RTASK FDB DOCOL,SEMIS
ERAM EQU *
*
*=======>> 158 << S->D
*
FCB $84 ; sign extend word to double
FCC 'S->'
FCB $C4
FDB COLD-7
STOD FDB DOCOL,DUP,ZLESS,MINUS
FDB SEMIS
*
*=======>> 159 << *
*
FCB $81 ; multiply two words
FCB $AA
FDB STOD-7
STAR FDB *+2
LDAA #16 ; bits/word counter
PSHA
CLRA
CLRB
TSX
STAR2 ROR 3,X ; shift multiplier
ROR 4,X
DEC 0,X ; done ?
BMI STAR4 ; yes
BCC STAR3
ADDD 1,X
STAR3 RORA
RORB ; shift result
BRA STAR2
STAR4 INS ; dump counter
INS
INS
JMP NEXT ;
*
*=======>> 160 << /MOD
*
FCB $84
FCC '/MO'
FCB $C4
FDB STAR-4
SLMOD FDB DOCOL,TOR,STOD,FROMR,USLASH
FDB SEMIS
*
*=======>> 161 << /
*
FCB $81 ; /
FCB $AF
FDB SLMOD-7
SLASH FDB DOCOL,SLMOD,SWAP,DROP
FDB SEMIS
*
*=======>> 162 << MOD
*
FCB $83
FCC 'MO'
FCB $C4
FDB SLASH-4
MOD FDB DOCOL,SLMOD,DROP
FDB SEMIS
*
*=======>> 163 << */MOD
*
FCB $85
FCC '*/MO'
FCB $C4
FDB MOD-6
SSMOD FDB DOCOL,TOR,USTAR,FROMR,USLASH
FDB SEMIS
*
*=======>> 164 << */
*
FCB $82
FCC '*'
FCB $AF
FDB SSMOD-8
SSLASH FDB DOCOL,SSMOD,SWAP,DROP
FDB SEMIS
*
*=======>> 165 << M/MOD
*
FCB $85
FCC 'M/MO'
FCB $C4
FDB SSLASH-5
MSMOD FDB DOCOL,TOR,ZERO,R,USLASH
FDB FROMR,SWAP,TOR,USLASH,FROMR
FDB SEMIS
*
*=======>> 166 << ABS
*
FCB $83
FCC 'AB'
FCB $D3
FDB MSMOD-8
ABS FDB DOCOL,DUP,ZLESS,ZBRAN
FDB ABS2-*
FDB MINUS
ABS2 FDB SEMIS
*
*=======>> 167 << DABS
*
FCB $84
FCC 'DAB'
FCB $D3
FDB ABS-6
DABS FDB DOCOL,DUP,ZLESS,ZBRAN
FDB DABS2-*
FDB DMINUS
DABS2 FDB SEMIS
*
* disc primitives
*
*=======>> 168 << USE
*
FCB $83
FCC 'US'
FCB $C5
FDB DABS-7
USE FDB DOCON
FDB XUSE
*
*=======>> 169 << PREV
*
FCB $84
FCC 'PRE'
FCB $D6
FDB USE-6
PREV FDB DOCON
FDB XPREV
*
*=======>> 170 << +BUF
*
FCB $84
FCC '+BU'
FCB $C6
FDB PREV-7
PBUF FDB DOCOL,LIT
FDB 260 ;
FDB PLUS,DUP,LIMIT
FDB EQUAL,ZBRAN
FDB PBUF2-*
FDB DROP,FIRST
PBUF2 FDB DUP,PREV,AT,SUB
FDB SEMIS
*
*=======>> 171 << UPDATE
*
FCB $86
FCC 'UPDAT'
FCB $C5
FDB PBUF-7
UPDATE FDB DOCOL,PREV,AT,AT,LIT,$8000,OR,PREV,AT,STORE
FDB SEMIS
*
*=======>> 172 << EMPTY-BUFFERS
*
FCB $8D
FCC 'EMPTY-BUFFER'
FCB $D3
FDB UPDATE-9
MTBUF FDB DOCOL,FIRST,LIMIT,OVER,SUB,ERASE
FDB SEMIS
*
*=======>> 175 << BUFFER
*
FCB $86
FCC 'BUFFE'
FCB $D2
FDB MTBUF-16
BUFFER FDB DOCOL,USE,AT,DUP,TOR
BUFFR2 FDB PBUF,ZBRAN
FDB BUFFR2-*
FDB USE,STORE,R,AT,ZLESS
FDB ZBRAN
FDB BUFFR3-*
FDB R,TWOP,R,AT,LIT,$7FFF,AND,ZERO,RW
BUFFR3 FDB R,STORE,R,PREV,STORE,FROMR,TWOP
FDB SEMIS
*
*=======>> 176 << BLOCK
*
FCB $85
FCC 'BLOC'
FCB $CB
FDB BUFFER-9
BLOCK FDB DOCOL,OFSET,AT,PLUS,TOR
FDB PREV,AT,DUP,AT,R,SUB,DUP,PLUS,ZBRAN
FDB BLOCK5-*
BLOCK3 FDB PBUF,ZEQU,ZBRAN
FDB BLOCK4-*
FDB DROP,R,BUFFER,DUP,R,ONE,RW,TWO,SUB
BLOCK4 FDB DUP,AT,R,SUB,DUP,PLUS,ZEQU,ZBRAN
FDB BLOCK3-*
FDB DUP,PREV,STORE
BLOCK5 FDB FROMR,DROP,TWOP
FDB SEMIS
*
*=======>> 177 << (LINE)
*
FCB $86
FCC '(LINE'
FCB $A9
FDB BLOCK-8
PLINE FDB DOCOL,TOR,LIT
FDB $40
FDB BBUF,SSMOD,FROMR,BSCR,STAR,PLUS,BLOCK,PLUS,LIT
FDB $40
FDB SEMIS
*
*=======>> 178 << .LINE
*
FCB $85
FCC '.LIN'
FCB $C5
FDB PLINE-9
DLINE FDB DOCOL,PLINE,DTRAIL,TYPE
FDB SEMIS
*
*=======>> 179 << MESSAGE
*
FCB $87
FCC 'MESSAG'
FCB $C5
FDB DLINE-8
MESS FDB DOCOL,WARN,AT,ZBRAN
FDB MESS3-*
FDB DDUP,ZBRAN
FDB MESS3-*
FDB LIT,4
FDB OFSET,AT,BSCR,SLASH,SUB,DLINE,BRAN
FDB MESS4-*
MESS3 FDB PDOTQ ; print message
FCB 6
FCC 'err # ' ; error number
FDB DOT ; print top of stack
MESS4 FDB SEMIS
*
*=======>> 180 << LOAD ; input scr #
*
FCB $84
FCC 'LOA'
FCB $C4
FDB MESS-10
LOAD FDB DOCOL,BLK,AT,TOR,IN,AT,TOR,ZERO,IN,STORE
FDB BSCR,STAR,BLK,STORE
FDB INTERP,FROMR,IN,STORE,FROMR,BLK,STORE
FDB SEMIS
*
*=======>> 181 << -->
*
FCB $C3
FCC '--'
FCB $BE
FDB LOAD-7
ARROW FDB DOCOL,QLOAD,ZERO,IN,STORE,BSCR
FDB BLK,AT,OVER,MOD,SUB,BLK,PSTORE
FDB SEMIS
*
*
*
*=======>> 182 << code for EMIT
*
*
*=======>> 183 << code for key
*
*
*=======>> 184 << code for ?TERMINAL
*
*
*=======>> 185 << code for CR
*
*
*=======>> 189 << BLOCK-WRITE ; write block to disk
*
FCB $8B
FCC 'BLOCK-WRIT'
FCB $C5
FDB ARROW-6
BWRITE FDB *+2
*
*
*
JMP NEXT
*
*=======>> 190 << BLOCK-READ ; read block from disk
*
FCB $8A
FCC 'BLOCK-REA'
FCB $C4
FDB BWRITE-14
BREAD FDB *+2
*
*
*
JMP NEXT
*
*=======>> 191 << R/W
*
FCB $83
FCC 'R/'
FCB $D7
FDB BREAD-13
RW FDB DOCOL
FDB ZBRAN ; branch if zero
FDB RW3-*
FDB BREAD ; read
FDB BRAN
FDB RW4-*
RW3 FDB BWRITE ; write
RW4 FDB SEMIS
*
*=======>> 192 << @@ ( an apostrophe )
*
FCB $C1
FCB $A7
FDB RW-6
TICK FDB DOCOL,DFIND,ZEQU,ZERO,QERR,DROP,LITER
FDB SEMIS
*
*=======>> 193 << FORGET
*
FCB $86
FCC 'FORGE'
FCB $D4
FDB TICK-4
*
*
*
FORGET FDB DOCOL,CURENT,AT,CONTXT,AT,SUB,LIT
FDB $18
FDB QERR,TICK,DUP,FENCE,AT,LESS,LIT
FDB $15
FDB QERR,DUP,NFA,DP,STORE,LFA,AT,CONTXT,AT,STORE
FDB SEMIS
*
*=======>> 194 << BACK
*
FCB $84
FCC 'BAC'
FCB $CB
FDB FORGET-9
BACK FDB DOCOL,HERE,SUB,COMMA
FDB SEMIS
*
*=======>> 195 << BEGIN
*
FCB $C5
FCC 'BEGI'
FCB $CE
FDB BACK-7
BEGIN FDB DOCOL,QCOMP,HERE,ONE
FDB SEMIS
*
*=======>> 196 << ENDIF
*
FCB $C5
FCC 'ENDI'
FCB $C6
FDB BEGIN-8
ENDIF FDB DOCOL,QCOMP,TWO,QPAIRS,HERE
FDB OVER,SUB,SWAP,STORE
FDB SEMIS
*
*=======>> 197 << THEN
*
FCB $C4
FCC 'THE'
FCB $CE
FDB ENDIF-8
THEN FDB DOCOL,ENDIF
FDB SEMIS
*
*=======>> 198 << DO
*
FCB $C2
FCC 'D'
FCB $CF
FDB THEN-7
DO FDB DOCOL,COMPIL,XDO1,HERE,THREE
FDB SEMIS
*
*=======>> 199 << LOOP
*
FCB $C4
FCC 'LOO'
FCB $D0
FDB DO-5
LOOP FDB DOCOL,THREE,QPAIRS,COMPIL,XLOOP,BACK
FDB SEMIS
*
*=======>> 200 << +LOOP
*
FCB $C5
FCC '+LOO'
FCB $D0
FDB LOOP-7
PLOOP FDB DOCOL,THREE,QPAIRS,COMPIL,XPLOOP,BACK
FDB SEMIS
*
*=======>> 201 << UNTIL
*
FCB $C5
FCC 'UNTI' ; ( same as end )
FCB $CC
FDB PLOOP-8
UNTIL FDB DOCOL,ONE,QPAIRS,COMPIL,ZBRAN,BACK
FDB SEMIS
*
*=======>> 202 << END
*
FCB $C3
FCC 'EN'
FCB $C4
FDB UNTIL-8
END FDB DOCOL,UNTIL
FDB SEMIS
*
*=======>> 203 << AGAIN
*
FCB $C5
FCC 'AGAI'
FCB $CE
FDB END-6
AGAIN FDB DOCOL,ONE,QPAIRS,COMPIL,BRAN,BACK
FDB SEMIS
*
*=======>> 204 << REPEAT
*
FCB $C6
FCC 'REPEA'
FCB $D4
FDB AGAIN-8
REPEAT FDB DOCOL,TOR,TOR,AGAIN,FROMR,FROMR
FDB TWO,SUB,ENDIF
FDB SEMIS
*
*=======>> 205 << IF
*
FCB $C2
FCC 'I'
FCB $C6
FDB REPEAT-9
IF FDB DOCOL,COMPIL,ZBRAN,HERE,ZERO,COMMA,TWO
FDB SEMIS
*
*=======>> 206 << ELSE
*
FCB $C4
FCC 'ELS'
FCB $C5
FDB IF-5
ELSE FDB DOCOL,TWO,QPAIRS,COMPIL,BRAN,HERE
FDB ZERO,COMMA,SWAP,TWO,ENDIF,TWO
FDB SEMIS
*
*=======>> 207 << WHILE
*
FCB $C5
FCC 'WHIL'
FCB $C5
FDB ELSE-7
WHILE FDB DOCOL,IF,TWOP
FDB SEMIS
*
*=======>> 208 << SPACES
*
FCB $86
FCC 'SPACE'
FCB $D3
FDB WHILE-8
SPACES FDB DOCOL,ZERO,MAX,DDUP,ZBRAN
FDB SPACE3-*
FDB ZERO,XDO1
SPACE2 FDB SPACE,XLOOP
FDB SPACE2-*
SPACE3 FDB SEMIS
*
*=======>> 209 << <#
*
FCB $82
FCC '<'
FCB $A3
FDB SPACES-9
BDIGS FDB DOCOL,PAD,HLD,STORE
FDB SEMIS
*
*=======>> 210 << #>
*
FCB $82
FCC '#'
FCB $BE
FDB BDIGS-5
EDIGS FDB DOCOL,DROP,DROP,HLD,AT,PAD,OVER,SUB
FDB SEMIS
*
*=======>> 211 << SIGN
*
FCB $84
FCC 'SIG'
FCB $CE
FDB EDIGS-5
SIGN FDB DOCOL,ROT,ZLESS,ZBRAN
FDB SIGN2-*
FDB LIT
FCB 0
FCC '-'
FDB HOLD
SIGN2 FDB SEMIS
*
*=======>> 212 << # ( octothorpe )
*
FCB $81
FCB $A3
FDB SIGN-7
DIG FDB DOCOL,BASE,AT,MSMOD,ROT,LIT
FDB 9
FDB OVER,LESS,ZBRAN
FDB DIG2-*
FDB LIT
FDB 7
FDB PLUS
DIG2 FDB LIT
FCB 0
FCC '0' ; ascii zero
FDB PLUS,HOLD
FDB SEMIS
*
*=======>> 213 << #S
*
FCB $82
FCC '#'
FCB $D3
FDB DIG-4
DIGS FDB DOCOL
DIGS2 FDB DIG,OVER,OVER,OR,ZEQU,ZBRAN
FDB DIGS2-*
FDB SEMIS
*
*=======>> 214 << .R
*
FCB $82
FCC '.'
FCB $D2
FDB DIGS-5
DOTR FDB DOCOL,TOR,STOD,FROMR,DDOTR
FDB SEMIS
*
*=======>> 215 << D.R
*
FCB $83
FCC 'D.'
FCB $D2
FDB DOTR-5
DDOTR FDB DOCOL,TOR,SWAP,OVER,DABS,BDIGS,DIGS,SIGN
FDB EDIGS,FROMR,OVER,SUB,SPACES,TYPE
FDB SEMIS
*
*=======>> 216 << D.
*
FCB $82
FCC 'D'
FCB $AE
FDB DDOTR-6
DDOT FDB DOCOL,ZERO,DDOTR,SPACE
FDB SEMIS
*
*=======>> 217 << . ( period )
*
FCB $81
FCB $AE
FDB DDOT-5
DOT FDB DOCOL,STOD,DDOT
FDB SEMIS
*
*=======>> 218 << ? ( question mark )
*
FCB $81
FCB $BF
FDB DOT-4
QUEST FDB DOCOL,AT,DOT
FDB SEMIS
*
*=======>> 219 << LIST
*
FCB $84
FCC 'LIS'
FCB $D4
FDB QUEST-4
LIST FDB DOCOL,DEC,CR,DUP,SCR,STORE,PDOTQ
FCB 6
FCC 'SCR # '
FDB DOT,LIT
FDB $10
FDB ZERO,XDO1
LIST2 FDB CR,I,THREE
FDB DOTR,SPACE,I,SCR,AT,DLINE,XLOOP
FDB LIST2-*
FDB CR
FDB SEMIS
*
*=======>> 220 << INDEX
*
FCB $85
FCC 'INDE'
FCB $D8
FDB LIST-7
INDEX FDB DOCOL,CR,ONEP,SWAP,XDO1
INDEX2 FDB CR,I,THREE
FDB DOTR,SPACE,ZERO,I,DLINE
FDB QTERM,ZBRAN
FDB INDEX3-*
FDB LEAVE
INDEX3 FDB XLOOP
FDB INDEX2-*
FDB CR
FDB SEMIS
*
*=======>> 221 << TRIAD
*
FCB $85
FCC 'TRIA'
FCB $C4
FDB INDEX-8
TRIAD FDB DOCOL,THREE,SLASH,THREE,STAR
FDB THREE,OVER,PLUS,SWAP,XDO1
TRIAD2 FDB CR,I
FDB LIST,QTERM,ZBRAN
FDB TRIAD3-*
FDB LEAVE
TRIAD3 FDB XLOOP
FDB TRIAD2-*
FDB CR,LIT
FDB $0F
FDB MESS,CR
FDB SEMIS
*
*=======>> 222 << VLIST
*
FCB $85
FCC 'VLIS'
FCB $D4
FDB TRIAD-8
VLIST FDB DOCOL,LIT
FDB $80
FDB OUT,STORE,CONTXT,AT,AT
VLIST1 FDB OUT,AT,COLUMS,AT,LIT
FDB 32
FDB SUB,GREAT,ZBRAN
FDB VLIST2-*
FDB CR,ZERO,OUT,STORE
VLIST2 FDB DUP,IDDOT,SPACE,SPACE,PFA,LFA,AT
FDB DUP,ZEQU,QTERM,OR,ZBRAN
FDB VLIST1-*
FDB DROP
FDB CR
FDB SEMIS
*
*=======>> 223 << PAUSE ; one second pause
*
FCB $85
FCC 'PAUS'
FCB $C5
FDB VLIST-8
PAUSE FDB *+2
LDX #1000 ; 1000 milliseconds
PAUS1 LDAA #$C8 ; 1 msec @ 4.00 mhz
PAUS2 DECA ;
BNE PAUS2 ;
DEX ;
BNE PAUS1 ;
JMP NEXT
*
*=======>> 224 << C/L ; characters/line
*
FCB $83
FCC 'C/'
FCB $CC
FDB PAUSE-8
CL FDB DOCON ; 64 characters per line
FDB 64
*
*=======>> 225 << DEPTH ; no operation
*
FCB $85
FCC 'DEPT'
FCB $C8
FDB CL-6
DEPTH FDB DOCOL,SZERO,AT,SPAT
FDB SUB,TWO,SLASH,ONE,SUB
FDB SEMIS
*
*=======>> 226 << .S ; print out contents of stack
*
FCB $82
FCC '.'
FCB $D3
FDB DEPTH-8
DOTS FDB DOCOL,DEPTH,ZBRAN ; if zero, print empty message
FDB DOTS2-*
FDB CR,SPAT,TWO,SUB
FDB SZERO,AT,TWO,SUB
FDB XDO1
DOTS1 FDB I,AT,DOT,LIT,$FFFE,XPLOOP
FDB DOTS1-*
FDB BRAN
FDB DOTS3-* ; skip over message
DOTS2 FDB PDOTQ
FCB 14
FCC ' stack empty! '
DOTS3 FDB QUIT,SEMIS
*
*=======>> 227 << DUMP
*
FCB $84
FCC 'DUM'
FCB $D0
FDB DOTS-5
DUMP FDB DOCOL,HEX,CR,CR,LIT,5,SPACES
FDB LIT,16,ZERO,XDO1
DUMP1 FDB I,LIT,3,DOTR,XLOOP
FDB DUMP1-*
FDB TWO,SPACES,LIT,16,ZERO,XDO1
DUMP2 FDB I,ZERO,BDIGS,DIG,EDIGS,TYPE,XLOOP
FDB DUMP2-*
FDB CR,OVER,PLUS,SWAP,DUP,LIT,$F
FDB AND,XOR,XDO1
DUMP3 FDB CR,I,ZERO,LIT,4,DDOTR,ONE
FDB SPACES,I,LIT,16,PLUS,I
FDB OVER,OVER,XDO1
DUMP4 FDB I,CAT,SPACE,ZERO,BDIGS,DIG,DIG
FDB EDIGS,TYPE,XLOOP
FDB DUMP4-*
FDB TWO,SPACES,XDO1
DUMP5 FDB I,CAT,DUP,LIT,32,LESS,ZBRAN
FDB DUMP6-*
FDB DROP,LIT,46
DUMP6 FDB DUP,LIT,126,GREAT,ZBRAN
FDB DUMP7-*
FDB DROP,LIT,46
DUMP7 FDB EMIT,XLOOP
FDB DUMP5-*
FDB LIT,16,XPLOOP
FDB DUMP3-*
FDB CR,SEMIS
*
*=======>> 228 << ROOM ; number of bytes available
*
FCB $84
FCC 'ROO'
FCB $CD
FDB DUMP-7
ROOM FDB DOCOL,SZERO,AT,DP,AT
FDB SUB,CR,DOT
FDB PDOTQ
FCB 16
FCC ' bytes available'
FDB CR,SEMIS
*
*=======>> 229 << U. ; print unsigned double number
*
FCB $82
FCC 'U'
FCB $AE
FDB ROOM-7
UDOT FDB DOCOL,ZERO
FDB DDOT,SEMIS
*
*=======>> 230 << NEXT-LINK ; address of NEXT
*
FCB $89
FCC 'NEXT-LIN'
FCB $CB
FDB UDOT-5
NEXTLNK FDB DOCON
FDB NEXT
*
*=======>> 231 << W ; address of W
*
FCB $81
FCB $D7
FDB NEXTLNK-12
WREG FDB DOCON
FDB W
*
*=======>> 232 << IP ; address of IP
*
FCB $82
FCC 'I'
FCB $D0
FDB WREG-4
IPREG FDB DOCON
FDB IP
*
*=======>> 235 << FLUSH ; flush updated buffers to disk
*
FCB $85
FCC 'FLUS'
FCB $C8
FDB IPREG-5
FLUSH FDB DOCOL
FDB LIT,8,ZERO,XDO1
FLUSH1 FDB LIT,$7FFF,BUFFER,DROP,XLOOP
FDB FLUSH1-*
FDB SEMIS
*
*=======>> << -ROT
*
FCB $84
FCC '-RO'
FCB $D4
FDB FLUSH-8
DROT FDB DOCOL,SWAP,TOR
FDB SWAP,FROMR,SEMIS
*
*=======>> << PICK
*
FCB $84
FCC 'PIC'
FCB $CB
FDB DROT-7
PICK FDB DOCOL,DUP,PLUS,SPAT
FDB PLUS,AT,SEMIS
*
*=======>> << MYSELF
*
FCB $C6
FCC 'MYSEL'
FCB $C6
FDB PICK-7
MSELF FDB DOCOL,LATEST,PFA,CFA,COMMA,SEMIS
*
*=======>> << ROLL
*
FCB $84
FCC 'ROL'
FCB $CC
FDB MSELF-9
ROLL FDB DOCOL,DUP,TWO,LESS,ZBRAN
FDB ROL1-*
FDB DROP,BRAN
FDB ROL2-*
ROL1 FDB SWAP,TOR,ONE,SUB
FDB ROLL,FROMR,SWAP
ROL2 FDB SEMIS
*
*=======>> << 2SWAP
*
FCB $85
FCC '2SWA'
FCB $D0
FDB ROLL-7
TSWAP FDB DOCOL,ROT,TOR
FDB ROT,FROMR,SEMIS
*
*=======>> << 2ROLL
*
FCB $84
FCC '2RO'
FCB $D4
FDB TSWAP-8
TROT FDB TOR,TOR,TSWAP
FDB FROMR,FROMR,TSWAP,SEMIS
*
*=======>> << 2DROP
*
FCB $85
FCC '2DRO'
FCB $D0
FDB TROT-7
TDROP FDB DOCOL,DROP,DROP,SEMIS
*
*=======>> << 2DUP
*
FCB $84
FCC '2DU'
FCB $D0
FDB TDROP-8
TDUP FDB DOCOL,OVER,OVER,SEMIS
*
*=======>> << 2OVER
*
FCB $85
FCC '2OVE'
FCB $D2
FDB TDUP-7
TOVER FDB DOCOL,LIT,4,PICK
FDB LIT,4,PICK,SEMIS
*
*=======>> << D-
*
FCB $82
FCC 'D'
FCB $AD
FDB TOVER-8
DSUB FDB DOCOL,DMINUS,DPLUS,SEMIS
*
*=======>> << D0=
*
FCB $83
FCC 'D0'
FCB $BD
FDB DSUB-5
DZEQ FDB DOCOL,OR,ZEQU,SEMIS
*
*=======>> << D0<
*
FCB $83
FCC 'D0'
FCB $BC
FDB DZEQ-6
DZLS FDB DOCOL,SWAP,DROP
FDB ZLESS,SEMIS
*
*=======>> << D=
*
FCB $82
FCC 'D'
FCB $BD
FDB DZLS-6
DEQ FDB DOCOL,DSUB
FDB DZEQ,SEMIS
*
*=======>> << D<
*
FCB $82
FCC 'D'
FCB $BC
FDB DEQ-5
DLS FDB DOCOL,DSUB,DZLS,SEMIS
*
*=======>> << D>
*
FCB $82
FCC 'D'
FCB $BE
FDB DLS-5
DGT FDB DOCOL,TSWAP,DLS,SEMIS
*
*=======>> << D+-
*
FCB $83
FCC 'D+'
FCB $AD
FDB DGT-5
DPLM FDB DOCOL,ZLESS,ZBRAN
FDB DPLM1-*
FDB MINUS
DPLM1 FDB SEMIS
*
*=======>> << D*
*
FCB $82
FCC 'D'
FCB $AA
FDB DPLM-6
DSTAR FDB DOCOL,OVER,LIT,5,PICK
FDB USTAR,LIT,6,ROLL
FDB LIT,4,ROLL,STAR,PLUS,TSWAP
FDB STAR,PLUS,SEMIS
*
*=======>> << UM*
*
FCB $83
FCC 'UM'
FCB $AA
FDB DSTAR-5
UMSTR FDB DOCOL,TOR,OVER,USTAR
FDB ROT,FROMR,STAR,PLUS,SEMIS
*
*=======>> << UM/
*
FCB $83
FCC 'UM'
FCB $AF
FDB UMSTR-6
UMSLSH FDB DOCOL,SWAP,OVER
FDB SLMOD,TOR,SWAP
FDB USLASH,SWAP,DROP
FDB FROMR,SEMIS
*
*=======>> << RESTORE ; restore disk head to track 0
*
FCB $87
FCC 'RESTOR'
FCB $C5
FDB UMSLSH-6
RESTR FDB *+2
*
*
*
JMP NEXT
*
*=======>> << SEEK ; disk head to track
*
FCB $84
FCC 'SEE'
FCB $CB
FDB RESTR-10
DSEEK FDB *+2 ;
*
*
*
JMP NEXT ;
*
*=======>> << TRACK ; disk head to track
*
FCB $85
FCC 'TRAC'
FCB $CB
FDB DSEEK-7
DTRACK FDB DOUSER ;
FDB XTRACK-UORIG ;
*
*=======>> << SECTOR ;
*
FCB $86
FCC 'SECTO'
FCB $D2
FDB DTRACK-8
DSECTOR FDB DOUSER ;
FDB XSECTOR-UORIG ;
*
*=======>> << ;
*
FCB $87
FCC 'DSTATU'
FCB $D3
FDB DSECTOR-9
DSTAT FDB DOUSER ;
FDB XDSTAT-UORIG ;
*
*=======>> XX << NOOP ; no operation
*
FCB $84
FCC 'NOO'
FCB $D0
FDB DSTAT-10
NOOP FDB NEXT ; a useful no-op
*
* end of forth
*
*
* reset vectors for rom
*
ORG $FFD6
SCI FDB INIT
SPI FDB INIT
PAIE FDB INIT
PAO FDB INIT
TOF FDB INIT
TOC5 FDB INIT
TOC4 FDB INIT
TOC3 FDB INIT
TOC2 FDB INIT
TOC1 FDB INIT
TIC3 FDB INIT
TIC2 FDB INIT
TIC1 FDB INIT
RTI FDB INIT
IRQ FDB INIT
XIRQ FDB INIT
SWI FDB INIT
ILLOP FDB INIT
COP FDB INIT
CLM FDB INIT
RST FDB INIT
*
*
*
* END